text view: Never show handles and popover at the same time
authorMatthias Clasen <mclasen@redhat.com>
Sun, 7 Jun 2015 16:12:43 +0000 (12:12 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 8 Jun 2015 10:55:21 +0000 (06:55 -0400)
Hide the handles when the popover appears, and brind them back
when it disappears. This will need revisiting if we start using
the popover for mouse interaction as well, where we may not
want handles to show up.

gtk/gtktextview.c

index 803acc3446c3cef96a7aeb0cd64902f43a777099..d061db263a9b899e7dca84f09c4f05ae29a48635 100644 (file)
@@ -9138,6 +9138,31 @@ gtk_text_view_get_selection_rect (GtkTextView           *text_view,
   rect->height = y2 - y1;
 }
 
+static void
+show_or_hide_handles (GtkWidget   *popover,
+                      GParamSpec  *pspec,
+                      GtkTextView *text_view)
+{
+  gboolean visible;
+  GtkTextHandle *handle;
+  GtkTextHandleMode mode;
+
+  visible = gtk_widget_get_visible (popover);
+
+  handle = text_view->priv->text_handle;
+  mode = _gtk_text_handle_get_mode (handle);
+
+  if (mode == GTK_TEXT_HANDLE_MODE_CURSOR)
+    {
+      _gtk_text_handle_set_visible (handle, GTK_TEXT_HANDLE_POSITION_CURSOR, !visible);
+    }
+  else if (mode == GTK_TEXT_HANDLE_MODE_SELECTION)
+    {
+      _gtk_text_handle_set_visible (handle, GTK_TEXT_HANDLE_POSITION_SELECTION_START, !visible);
+      _gtk_text_handle_set_visible (handle, GTK_TEXT_HANDLE_POSITION_SELECTION_END, !visible);
+    }
+}
+
 static void
 activate_bubble_cb (GtkWidget   *item,
                     GtkTextView *text_view)
@@ -9211,6 +9236,8 @@ bubble_targets_received (GtkClipboard     *clipboard,
                                GTK_STYLE_CLASS_TOUCH_SELECTION);
   gtk_popover_set_position (GTK_POPOVER (priv->selection_bubble), GTK_POS_BOTTOM);
   gtk_popover_set_modal (GTK_POPOVER (priv->selection_bubble), FALSE);
+  g_signal_connect (priv->selection_bubble, "notify::visible",
+                    G_CALLBACK (show_or_hide_handles), text_view);
 
   box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
   g_object_set (box, "margin", 10, NULL);